package java学习.第17章_反射机制;

import org.junit.Test;

/**
 * 1.类的装载
 *      将类的class文件读入内存，并为之创建一个 java.lang.Class 对象
 *      此过程由类的加载器完成
 * 2.链接(linking)
 *      > 验证(Verify) 确保加载的类信息符合JVM规范，
 *          例如 以16进制  ca fe ba be 开头，没有安全方面问题
 *      > 准备(Prepare) 正式为类变量(static) 分配内存并设置变量默认初始值的阶段
 *          将这些内存都将在方法区中进行分配
 *      > 解析(Resolve) 虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程
 * 3.初始化(initialization)
 *      执行类构造器<clinit>()方法的过程
 *      类构造器<clinit>()方法是由编译期自动收集类中
 *      所有类变量的赋值动作和静态代码块中的语言合并产生的。
 *
 */

public class E_类的加载过程 {
    /**
     * 类加载器
     * 引导类加载器(启动类加载起):(BootstrapClassLoader)
     *          用 C/C++ 编写的，是JVM自带的类加载器，获取为 null
     *          负责Java平台核心库，用来装载核心类库
     *          (JAVA_HOME/jre/lib/rt.jar 或sum.boot.class.path路径下的内容)。
     *          该加载器无法直接获取
     * 扩展类加载器:(ExtensionClassLoader)
     *          负责 ie/ib/ex 目录下的jar包或
     *          -D java.ext.dirs指定目录下的ar包装入工作库
     * 系统类加载器:(SystemClassLoader/ApplicationClassLoader)
     *          负责java -classpath或
     *          -D java.class.path所指的目录下的类与
     *          jar包装入工作，是最常用的加载器
     *  用户自定义加载器:
     *          实现应用隔离(同一个类在同一个应用程序中可加载多份)
     */
    @Test
    public void 类加载器的顺序(){
        C_获取Class实例 jvm = new C_获取Class实例();
        System.out.println(jvm.getClass().getClassLoader());//jvm是谁装载的
        System.out.println(jvm.getClass().getClassLoader().getParent());//jvm的上一个装载器
        System.out.println(jvm.getClass().getClassLoader().getParent().getParent());//jvm的上上一个装载
    }
}
/*
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
jdk.internal.loader.ClassLoaders$PlatformClassLoader@256216b3
 */